from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import csv
import time

# Función para desplazar hacia abajo hasta el final de la página
def scroll_to_bottom(driver):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)  # Ajustar el tiempo de espera según sea necesario


# Función para desplazar hacia abajo progresivamente hasta el final de la página
def progressive_scroll(driver, scroll_pause_time=1, scroll_increment=900):
    last_height = driver.execute_script("return document.body.scrollHeight")
    print(last_height)
    while True:
        driver.execute_script(f"window.scrollBy(0, {scroll_increment});")
        time.sleep(scroll_pause_time)  # Ajustar el tiempo de espera según sea necesario
        new_height = driver.execute_script("return document.body.scrollHeight")
        print(new_height)
        if new_height == last_height:
            break
        last_height = new_height

# URL de la página principal donde se encuentran todos los links
main_page_url = "https://www.opentable.com/s?dateTime=2024-07-31%2020%3A45&covers=2&latitude=38.71612&longitude=-75.081515&term=rehoboth%20beach&shouldUseLatLongSearch=true&orig=&corr

# Configurar Selenium para utilizar el controlador adecuado (por ejemplo, ChromeDriver)
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

# Abrir la página principal con Selenium
driver.get(main_page_url)

# Esperar a que la página se cargue completamente (puedes ajustar el tiempo de espera según sea necesario)
driver.implicitly_wait(10)

# Realizar el desplazamiento progresivo para cargar todos los resultados
progressive_scroll(driver)


# Obtener el contenido HTML de la página principal
main_page_source = driver.page_source

# Analizar el contenido HTML de la página principal
main_soup = BeautifulSoup(main_page_source, 'html.parser')

# Extraer todos los enlaces de los restaurantes
restaurant_links = main_soup.select('a.qCITanV81-Y-[href*="/r/"]')


# Crear una lista para almacenar los enlaces únicos
unique_links = []
for link in restaurant_links:
    href = link['href']
    full_url = f"{href}"
    if full_url not in unique_links:
        unique_links.append(full_url)

for links in unique_links:
    print(links)

# Crear una lista para almacenar los datos de los restaurantes
restaurants = []
reviews = []


# Iterar sobre los enlaces únicos de los restaurantes
for url in unique_links:
    try:

        # Desplazar hasta el final de la página
        scroll_to_bottom(driver)
        
        # Abrir la página del restaurante con Selenium
        driver.get(url)
        print(url)
        # Esperar a que la página se cargue completamente (puedes ajustar el tiempo de espera según sea necesario)
        driver.implicitly_wait(10)
        
        # Obtener el contenido HTML de la página actual
        page_source = driver.page_source
        
        # Analizar el contenido HTML de la página
        soup = BeautifulSoup(page_source, 'html.parser')
        
        # Extraer el nombre del restaurante/hotel usando el selector proporcionado
        restaurant_name_tag = soup.find(class_='E-vwXONV9nc-')
        restaurant_name = restaurant_name_tag.text.strip() if restaurant_name_tag else "Nombre no encontrado"
        print(restaurant_name)

        # Agregar el nombre del restaurante a la lista
        restaurants.append([restaurant_name, url])
        
        # Pausar brevemente para evitar cargar el servidor (opcional)
        time.sleep(3)
        
        # Variables para el bucle de paginación
        page_num = 1
        page_limit = 10  # Límite de páginas de reseñas a extraer
        next_button_disabled = False
        
        while page_num < page_limit and not next_button_disabled:

            try:
                               
                # Desplazar hasta el final de la página
                scroll_to_bottom(driver)

                # Obtener el contenido HTML de la página del restaurante
                restaurant_page_source = driver.page_source
                
                # Analizar el contenido HTML de la página del restaurante
                restaurant_soup = BeautifulSoup(restaurant_page_source, 'html.parser')
                
                # Extraer las reseñas del restaurante
                restaurant_reviews = restaurant_soup.find_all('div', class_='_6rFG6U7PA6M-')
                
                # Agregar las reseñas a la lista
                for container in restaurant_reviews:
                    review_text_tag = container.find('span', class_='l9bbXUdC9v0- ZatlKKd1hyc- ukvN6yaH1Ds-')
                    review_text = review_text_tag.text.strip() if review_text_tag else "Texto de reseña no encontrado"
                    print(review_text)
                    reviews.append([restaurant_name, review_text])
                
                # Ejecutar el script para hacer clic en el botón "Siguiente"
                next_button_script = """
                    var nextButton = document.querySelector('a[aria-label="Go to the next page"]');
                    if (nextButton) {
                        nextButton.click();
                        return true;
                    } else {
                        return false;
                    }
                """

                next_button_clicked = driver.execute_script(next_button_script)
                
                if not next_button_clicked:
                    next_button_disabled = True
                else:
                    driver.implicitly_wait(10)
                

                page_num += 1
                print(page_num)

            except Exception as e:
                print(f"Error al procesar la paginación en {url}: {e}")
                break
    except Exception as e:
        print(f"Error al abrir la página {url}: {e}")

# Cerrar el navegador controlado por Selenium
driver.quit()

# Ruta del archivo CSV
csv_file_path = "Rehoboth_Beach_Reviews.csv"
restaurants_csv_file_path = "Rehoboth_Beach_Restaurants.csv"

# Guardar las reseñas en un archivo CSV
with open(csv_file_path, "w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerow(["Restaurant Name", "Review Text"])
    writer.writerows(reviews)


# Guardar la lista de restaurantes y URLs en un archivo CSV
with open(restaurants_csv_file_path, "w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerow(["Restaurant Name", "URL"])
    writer.writerows(restaurants)

print("Las reseñas se han guardado correctamente en 'Rehoboth_Beach_Reviews.csv'.")